package swim.entitybeans;
import java.io.Serializable;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="utente")
public class Utente implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 7413221664220543175L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="utente_id",unique=true, nullable=false)
	private Long id;
	private String email_login;
	private String password;
	private String nome;
	private String cognome;
	private String telefono;
	private String email_contatto;
	private String citta;
	@ManyToMany(cascade = {CascadeType.ALL}, fetch=FetchType.EAGER)
	@JoinTable(name="possesso", 
		joinColumns={@JoinColumn(name="utente_id")}, 
		inverseJoinColumns={@JoinColumn(name="abilita_id")})
	private Set<Abilita> abilita;
	@OneToMany(mappedBy="dato_da")
	private Set<Aiuto> aiuti_dati;
	@OneToMany(mappedBy="ricevuto_da")
	private Set<Aiuto> aiuti_ricevuti;
	
	@OneToMany(mappedBy="ricevente")
	private Set<Amicizia> amicizie_richieste;
	@OneToMany(mappedBy="richiedente")
	private Set<Amicizia> amicizie_ricevute;
	@Column(columnDefinition = "TEXT")
	private String descrizione;
	private Long aiuto_dato=0L;
	private Long aiuto_ricevuto=0L;
	private boolean foto;
	
	public String getEmail_login() {
		return email_login;
	}
	public void setEmail_login(String email_login) {
		this.email_login = email_login;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getCognome() {
		return cognome;
	}
	public void setCognome(String cognome) {
		this.cognome = cognome;
	}
	public String getTelefono() {
		return telefono;
	}
	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}
	public String getEmail_contatto() {
		return email_contatto;
	}
	public void setEmail_contatto(String email_contatto) {
		this.email_contatto = email_contatto;
	}
	public String getCitta() {
		return citta;
	}
	public void setCitta(String citta) {
		this.citta = citta;
	}
	public String getDescrizione() {
		return descrizione;
	}
	public void setDescrizione(String descrizione) {
		this.descrizione = descrizione;
	}
	public Long getAiuto_dato() {
		return aiuto_dato;
	}
	public void setAiuto_dato(Long aiuto_dato) {
		this.aiuto_dato += aiuto_dato;
	}
	public Long getAiuto_ricevuto() {
		return aiuto_ricevuto;
	}
	public void setAiuto_ricevuto(Long aiuto_ricevuto) {
		this.aiuto_ricevuto += aiuto_ricevuto;
	}
	public boolean isFoto() {
		return foto;
	}
	public void setFoto(boolean foto) {
		this.foto = foto;
	}
	public Long getId() {
		return id;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Utente other = (Utente) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	public Set<Abilita> getAbilita() {
		return abilita;
	}
	public void setAbilita(Set<Abilita> abilita) {
		this.abilita = abilita;
	}
	
	public Set<Aiuto> getAiuti_ricevuti() {
		return aiuti_ricevuti;
	}
	public void setAiuti_ricevuti(Set<Aiuto> aiuti_ricevuti) {
		this.aiuti_ricevuti = aiuti_ricevuti;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public Set<Amicizia> getAmicizie_richieste() {
		return amicizie_richieste;
	}
	public void setAmicizie_richieste(Set<Amicizia> amicizie_richieste) {
		this.amicizie_richieste = amicizie_richieste;
	}
	public Set<Amicizia> getAmicizie_ricevute() {
		return amicizie_ricevute;
	}
	public void setAmicizie_ricevute(Set<Amicizia> amicizie_ricevute) {
		this.amicizie_ricevute = amicizie_ricevute;
	}
	public Set<Aiuto> getAiuti_dati() {
		return aiuti_dati;
	}
	public void setAiuti_dati(Set<Aiuto> aiuti_dati) {
		this.aiuti_dati = aiuti_dati;
	}
	
	public void addAbilita(Abilita abilita) {
        if (!getAbilita().contains(abilita)) {
            getAbilita().add(abilita);
        }
        if (!abilita.getUtenti().contains(this)) {
            abilita.getUtenti().add(this);
        }
    }
}
